﻿using System;
using System.Windows.Forms;
using AutomatedDecisionMaking.Class;
using AutomatedDecisionMaking.Class.Algorithms;

namespace AutomatedDecisionMaking.GUI.MinRegretWindow
{
    public partial class FrmMinRegret : Form
    {
        #region Pola prywatne, konstruktor i podstawowa obsługa okna
        private readonly MinRegretAlgorithm _mAlgorithm; /// Algorytm realizujący obliczenia

        ///<summary>
        /// Konstrukotr okna analizy najmniejszego żalu
        /// </summary>
        /// <param name="decisionMatrix">Macierz decyzji użytkownika</param>
        public FrmMinRegret(DecisionMatrix decisionMatrix)
        {
            InitializeComponent();
            _mAlgorithm = new MinRegretAlgorithm(decisionMatrix);
            ShowPanel1();
        }

        /// <summary>
        /// Wyświetlenie Panelu nr 1
        /// </summary>
        private void ShowPanel1()
        {
            Panel1.Visible = true;
            Panel2.Visible = false;
            Panel3.Visible = false;
        }

        /// <summary>
        /// Wyświetlenie Panelu nr 2
        /// </summary>
        private void ShowPanel2()
        {
            Panel1.Visible = false;
            Panel2.Visible = true;
            Panel3.Visible = false;
        }

        /// <summary>
        /// Wyświetlenie Panelu nr 3
        /// </summary>
        private void ShowPanel3()
        {
            Panel1.Visible = false;
            Panel2.Visible = false;
            Panel3.Visible = true;
        }

        /// <summary>
        /// Metoda przygotowująca wygląd okna przed jego uruchomieniem.
        /// </summary>
        /// <param name="sender">Obiekt wysyłajacy zdarzenie</param>
        /// <param name="e">Obsługiwane zdarzenie</param>
        private void FrmMinRegret_Load(object sender, EventArgs e)
        {
            _mAlgorithm.CalculateSolution();

            var maxInRows = _mAlgorithm.GetMaxInRowsStr();
            foreach (string s in maxInRows)
                p1ListBox_MaxInRows.Items.Add(s);


            int columnNo = _mAlgorithm.GetDecisionMatrix().ScenarioList.Count;
            for (int i = 0; i < columnNo; ++i)
                p2DataGridView_RegretTable.Columns.Add("S" + (i + 1), "S" + (i + 1));

            int rowNo = _mAlgorithm.GetDecisionMatrix().DecisionList.Count;
            for (int i = 0; i < rowNo; ++i)
            {
                p2DataGridView_RegretTable.Rows.Add();
                p2DataGridView_RegretTable.Rows[i].HeaderCell.Value = "D" + (i + 1);
            }

            var regretMatrix = _mAlgorithm.GetRegretMatrix();
            for (int i = 0; i < regretMatrix.Count; ++i)
            {
                var regretRow = regretMatrix[i];
                for (int j = 0; j < regretRow.Count; ++j)
                {
                    p2DataGridView_RegretTable.Rows[i].Cells[j].Value = regretRow[j];
                }
            }

            var maxInRegretRows = _mAlgorithm.GetMaxValuesStr();

            foreach (string s in maxInRegretRows)
                p3ListBox_MaxInRows.Items.Add(s);

            p3TextBox_MinValue.Text = _mAlgorithm.GetMaxMinValue().ToString();

            p3Label_Decision.Text = _mAlgorithm.GetDecision();

        }
        #endregion

        #region Obsługa przycisków nawigacji
        /// <summary>
        /// Metoda obsługująca zdarzenie wygenerowane podczad kliknięcia
        /// przycisku next na panelu 1
        /// </summary>
        /// <param name="sender">Obiekt wywołujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie jakie wystąpiło</param>
        private void p1ButtonNext_Click(object sender, EventArgs e)
        {
            ShowPanel2();
        }

        /// <summary>
        /// Metoda obsługująca zdarzenie wygenerowane podczad kliknięcia
        /// przycisku prev na panelu 2
        /// </summary>
        /// <param name="sender">Obiekt wywołujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie jakie wystąpiło</param>
        private void p2ButtonPrev_Click(object sender, EventArgs e)
        {
            ShowPanel1();
        }

        /// <summary>
        /// Metoda obsługująca zdarzenie wygenerowane podczad kliknięcia
        /// przycisku next na panelu 2
        /// </summary>
        /// <param name="sender">Obiekt wywołujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie jakie wystąpiło</param>
        private void p2ButtonNext_Click(object sender, EventArgs e)
        {
            ShowPanel3();
        }

        /// <summary>
        /// Metoda obsługująca zdarzenie wygenerowane podczad kliknięcia
        /// przycisku prev na panelu 3
        /// </summary>
        /// <param name="sender">Obiekt wywołujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie jakie wystąpiło</param>
        private void p3ButtonPrev_Click(object sender, EventArgs e)
        {
            ShowPanel2();
        }

        /// <summary>
        /// Metoda obsługująca zdarzenie wygenerowane podczad kliknięcia
        /// przycisku begin na panelu 4
        /// </summary>
        /// <param name="sender">Obiekt wywołujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie jakie wystąpiło</param>
        private void p4ButtonBegin_Click(object sender, EventArgs e)
        {
            ShowPanel1();
        }
        #endregion
    }
}
